The good ideas I suggested were basic PWM fading, and sine wave fading, standard PWM fading isn't that hard, sine wave fading is a little more complex because it requires a lookup table.
I second both Diver and WP100, examine the code you've already programmed. The first thing you'll want to do is print the instruction list for your particular PIC, tells you what each and every instruction does and what registers it effects. That's for ASM programming though C programming you'll want to brush up on C itself a bit then view others code to see the differences between normal C and micro controller C.
Nigel's tutorial are all good simple projects and can easily be taken apart to understand them. Start off with the simplest projects on Nigels site until you actually fully understand everythign that's going on with them. I use AVR's not PIC's but the same rules apply, and the first time I had to write my own code it took me over an hour to get a good solid blinking LED going, because of the DDR registeres on the AVR's, which are similar to the TRIS registers on the PIC, set them wrong and nothing happens =) Also for software LED blinking it takes a little bit to understand juts how fast this little beasties really are. A fast PIC or AVR is executing of 5-20 million instructions per second. Turning an LED on and off is easy. Turning it on slow enough for a human to see it requires a delay loop to waste a lot of time.
Sorry for the babble.