Many of the solutions seem to be massively overcomplicated. As mahjongg said, the right solution is to simply grab an extra chip that can generate PWMs for you, and learn how to interface it. There are plenty such ICs on the market, and any solution involving more than two chips is probably making it harder than it needs to be. Anything involving analog signals of any kind is making this harder than it needs to be. Grabbing a microcontroller just to generate PWM outputs is also a bit excessive, like killing ants with a flamethrower. There are much easier ways to add PWMs to a raspberry pi.
Things like the adafruit breakout (based on an NXP chip whose name I cannot remember) or TCA6507 are pretty good if you have them, and they're i2c chips so they only require 2 lines to control. However they're surface mount devices which may be inconvenient for a hobbyist. You can find breakout boards that put SMT chips into a through-hole footprint, but that adds cost and it's also kind of annoying.
The easiest solution by far, then, is to use a simple DIP PWM driver, such as the TLC5940 which plenty of people know how to use (http://flipmu.com/files/2011/04/Demysti ... LC5940.pdf
). The interface and logic is the same as a shift register (basically it's SPI) and there's plenty of work available on how to use it. Comes in a PDIP package (28 pins iirc), 16 PWM channels. You aren't going to get sixteen channels with any solution cobbled out of a 555 timer. Not as powerful as the i2c chips (it requires an external PWM clock, which is kind of inconvenient. the adafruit chip is free-running, meaning that it clocks itself) but more than enough to get this job done in one package.
If you want to do the PWM in software, I have seen some implementations of that in this forum, looks promising. Not sure how rigorous it would be though, since you have to rely on the OS to schedule, and it's not a real-time system, etc etc. I'd be more confident in an external chip.