Everything revolves here (pun intended) around NCO and its phase accumulator.
If you desire pure sine of arb frequency, have one quadrant LUT of sine function and use simple decoder logic for sign, or even better use CORDIC. Arbitary square, triangle and sawtooth signals are just about how you handle the output from the phase accumulator.
Also use proper DAC with lowpass reconstruction filter, not R2R network.