Hey Alex,
You could perhaps use program statuses to help track this depending on how you want to bucket your time frames for reporting.
If your channel has a status of "opened" and any subsequent status (e.g., clicked) must first pass through open, then you would know that anyone with a status of "opened" or greater had opened at least one email.
The campaign to change the status would trigger off
Email is opened
Email name contains [engagement program name]
Flow - change status in program to Opened
This one campaign could cover you for any email in the program.
In your reports you could use "created date" as a filter in a smart list to see only certain cohorts of leads in the program.
If you are looking to cohort by activity date instead (i.e., the date of the email being opened) I think you are back to smart lists for this.