I take issue with the following statements:
- I believe that the older versions of Visual Basic .NET through 2005 do not have delegate covariance and contravariance.
- I do fully realize that this verges on blasphemy.
First of all, nothing you have done here has anything to do with covariance or contravariance. (Edit: The previous statement is wrong, for more information please see Covariance and Contravariance in Delegates) This solution will work just fine in all CLR versions 2.0 and up (obviously this will not work in a CLR 1.0 application as it uses generics).
Secondly, I strongly disagree that your idea verges on "blasphemy" as this is a wonderful idea.