Though I can't code it for you or promise you success, if it were my gig, here's how I'd do it.
Extend the Calendar class to AllWorkshopsHolder, and overload the getStandardEvents(), getRecurringEvents(), and getAnnouncements(), and possibly even the Events() method, as well, and have them include other WorkshopsHolders in your result set. This will grant you the liberty to simply hard code your class names, rather than relying on the Calendar "magic" to figure them out via your has_one and has_many arrays.
Like I said, it's too complex for me to give you example code, but if you build it out, post your work along with any problems you're having, I can do my best to figure it out. Good luck!