The Wallet app should probably automatically hide time-based items when their time has passed. Creators of passes should be able to set an expiration date. And users should be able to batch-delete passes.
The accumulation of expired passes is frustrating, especially if you’re traveling on connecting flights and have several passes from the same airline. I can’t tell you how many times I’ve tried to board a flight with the wrong boarding pass. However, this does appear to be, in part, by design. As Apple’s Wallet Developer Guide states:
Don’t try to expire or void a pass by pushing an update. Updates are not guaranteed to be delivered, because the user may not have a network connection or may have disabled updates for the pass. Instead, update your database to indicate that the pass is invalid, and consult your database when the pass is redeemed. Additionally, your app should not remove expired passes without the user’s consent.
This is likely for good reason, especially when it comes to air travel. There are always situations where passengers might need to present their boarding pass after traveling. If you’ve ever booked travel for multiple people, you may have only sent them their boarding passes – the only “proof” they’d readily have access to, should they require it.
Instead, I’d prefer that there is a separate section of Wallet specifically for expired passes, and echo Jason’s suggestion of a means to bulk-delete all expired passes. That way, they’re all grouped together and out of the main view.