I don't have any brilliant insights into your problem, but one problem that strikes me is events that are open-ended in their timespan. Those are (more or less) impossible to pre-insert into your database.
And one option to simplify the selection of events would be to only allow a limited number of variants of recurrence for events, and then writing a really clever SQL query to select the relevant events. You might also be able to do something nice if you use a weird database schema (some form of denormalised schema perhaps).