A good iterative approach taken by many hourly jobs is to have some scheduling horizon, say 1 week in advance.
You run the scheduler software, then send each employee a text message saying "We're offering you a shift Monday at 9am for 8 hours. Accept?". After 24 hours, rerun the scheduler with accepted/denied shifts as constraints, and repeat till all shifts are filled.
Obviously you may not end up with optimal schedules when people start denying shifts, but you get pretty close.
When a particular shift gets denied by more than ~3 people, they normally give a ~30% pay boost for that shift to get it filled.