best approach?
NIH? Speculating on someone else's intentions is a losing battle. I suspect it often comes down to what's lurking in your junkbox.
Have to admit I felt a slight annoyance looking at your solution, since I'd spent some time coming up with an elegant "all-digital" approach. You and tdb realized that PWM wasn't needed to solve the problem, and you both implemented inexpensive D/A solutions.
My vote for the simplest end solution would be to use one of the popular 8-pin micros (PIC12C508 or 12F629. Atmel's tinyAVR series is worth a look, too). This is also my vote for many of the problems posed in these forums Buy a tube of them from Digi-Key for $1 apiece. That's less than what some of the TTL and CMOS parts sell for, and a micro can often replace several. Also get a tube of HC164s and HC165s for I/O expansion, and HC299s for data lines.
Back to the lamp dimmer. Two input pins, one PWM output. Of course, all the messy details like pull-ups, switch debouncing, and PWM emulation need to be handled under the hood. What you get in return is a very flexible design. For example, it's just as easy to implement distributed-PWM as the traditional sort, if the application would benefit.
Go through the learning curve, it's not that bad. Designing with discrete MSI logic had its place in the '80s. It's still fun to come up with clever uses for standard TTL and CMOS parts, but unless you lack access to micros or operating speed is important, there are better ways to design these days.
My own biased opinion - CAL