Ok, I believe I've located the problem. In SPWM_INT.BAS (the INCLUDE file), it relies on the carry bit to be set when the channel setting is greater than the number of periods passed (the result of "count" MINUS "setting"). As long as the result is negative (rollover) it sets the carry flag. Hence if they're EQUAL, the carry bit remains unset, so the first setting is always neglected by my reckoning (at least that's what I'm seeing on the scope).

I added one line of code (in red) below in the SPWM_INT.BAS file. Not sure what this will do if you're running with 255 levels because it'll roll over - so be cautious.

NotIdle
MOVE?BA _DutyCount ; Copy DutyCount to W reg
ADDLW 1 ; add 1 to dutycount because you're using carry as the flag
CHK?RP DutyVar ; Select proper bank
subwf DutyVar, W ; Subtract DutyVar from DutyCount
MOVE?TT STATUS,C, Port,Pin ; Copy carry bit to Port/Pin