A little more straightforward way could be
var allTriggerKeys = sched.GetTriggerKeys(GroupMatcher<TriggerKey>.AnyGroup());
foreach (var triggerKey in allTriggerKeys)
{
ITrigger trigger = sched.GetTrigger(triggerKey);
}
Why so complicated and slow? The thing here is that there is trigger polymorphism and the type (and thus the associated data via linked table) is not known beforehand. After base record is loaded the rest of data can be loaded. And yes, the API was not originally meant for set operations.
If you are just reporting, I'd say bite the bullet and create the custom SQL query with (outer) joins etc. Just don't update Quartz's tables without Quartz knowing about it. Also don't issue DB locks. Prepare to fix the the query if schema changes.