Hello Jason,
You can create a task that contains lines from different ports of one same device. You can also define the "lines" input of your Digital Output DAQmx Create Channel vi to be for example Dev1/port0/line0, Dev1/port1/line0. DAQmx Write (digital Wfm 1Chan NSamp) is not restricted only to lines on the same port as long as it's from the same device. No, you don't need to use a separate virtual channel for each output port.
Hope this helps,
LA