How can I achieve a better temporal spread of shifts across all employees, and include balanced holiday coverage as well?

This sounds familiar! In my case, I used sequence constraints, specifically soft negative constraints on shift distance per employee.

I defined a custom interval variable for each person and then added penalties if two shifts were too close in time. That way, the solver naturally preferred solutions that Shift Up And Spread assignments over time.

For holiday coverage, I flagged holiday dates and added a per-employee counter to balance those too. Worked great for rotating long weekends!