Or you could directly PWM the outputs themselves
That would require tremendous amount of data being sent over the spi. I would say that's practically no-workable.
In that case (hc164 for example), the OP's original solution is better. Then it runs into the cross-conduction problem.