Thanks Sue and Jason. We have 15,000 - 20,000 report runs per day, so the volume is pretty significant. Our ETL runs several times per day. The volume of data that the ETL brings in can vary quite a bit, which results in varying ETL end times. As a result, expiring the cache on a pre-set schedule is tough; that's why we went with the approach of expiring the cache programatically at the end of the ETL. The code that I am using in the ETL (EXEC dbo.AddEvent @EventType = 'SharedSchedule' ...) was picked up by profiling the timed schedule expiration anyway, so I think we would be running into the same issue if I just set the shared schedule to expire on a timed schedule.
I'm not too keen on the idea of altering internal MS sprocs, so I think I'm going to stick with calling the FlushReportFromCache sproc serially for each dataset at the end of the ETL. It's ugly, but I think it will work.