This is one way of getting a programable current source from a microcontroller.
R1 = 30k
hm:
R3 = 10k
hm:
R2 will have a maximum of 1.66 V across it and you set the maximum LED current by the value of R3.
You can put several LEDs in series, depending on the supply voltage.
You can daisy-chain several LT1257s if you want.
The brightness works the wrong way round, in that 000 to the D/A is full on and FFF is off, but it is linear for current.
You might be able to find a more suitable D/A as the LT1257 is 12 bit, and it needs a high voltage supply to swing to 5V output.
Multiple PWM with a PIC is very difficult, unless they have hardware modules to do it. The problem is that the program can only change one output at a time and if there are several outputs opperating at different times it is difficult to devise code to do it all at the right times. You could do it with multitasking code if you don't mind it not being very accurate.
The circuit that I have suggested will also work with a PWM feeding a smoothing circuit, which then feeds the R1, and the A/D is not needed.