For the PLL, how would you filter the phase signal over the range of 1Hz to 2MHz effectively? You'd need a huge time constant to handle the 1Hz signal which would mean you'd probably be waiting maybe 10 seconds for a lock.
Do you need all waveforms at once? It's obviously easier just to get the sine and sawtooth waveforms from the DDS (sine can still pass through your elliptic filter), and derive the squarewave from the sine or sawtooth waveforms.
PLL pretty much won't work for 1Hz to 2MHz, without some huge compromises.
If you want that sort of range, then I would probably stick with the DDS (especially if you have it working) and figure out the ramp generator. Split the problem/range into manageable chunks, and as you have a micro, probably do something like this:
Make 4+ sections, that cover the ranges (for example!): 1Hz to 100Hz, 100Hz to 10KHz, 10KHz - 200KHz, 200KHz - 2MHz. For each section, build:
1. Build a ramp generator (basically a *constant-current source driving a capacitor), drive the ramp/reset from your DDS.
2. Build a peak detector, feed the output of this into your micro.
3. *Build a digitally variable constant current source - pretty simple to do with a 16bit DAC, opamp, transistor.
You can probably reuse the DAC across the ranges, also the peak-detector - but you'll want to optimize each of the ramp generators. Try and keep the peak currents to 100-200uA, perhaps more on the fast sections.
Then you could use several control strategies:
fast sweep - use a table of current settings to maintain the correct amplitude
accurate - use the peak-detector to automatically adjust the current to hit the correct amplitude
you could also create a hybrid of the above.
Making and adjustable duty-cycle version is more complex, but quite possible. Get a simple one running first though! You might also want to have overlapping ranges, and perhaps one range that covers audio-friendly sweeps (20Hz to 20KHz).
As for DAC's - use some low-cost 24bit stereo parts, or perhaps you have a spare DDS that you can set for DC (unlikely to be more than 12bit though).