Ich würde einfach anstatt ShellExecute() CreateProcess() verwenden. Dann kannst du warten, bis ein Dokument ausgedruckt ist und danach das nächste drucken.
Funktioniert dann zwar nicht "parallel", aber da der Drucker der limitierende Faktor sein dürfte, macht das nicht so viel aus.
Den gesamten Druckprozess kann man ja in einen Thread oder Prozess auslagern, damit man mit der Oberfläche weiterarbeiten kann.
Gruß,
Olli
Oder
WaitForSingleObject()