This may be a silly question, but you do realize that you don't have to do anything drastic, or even complex to add information to any control at run time (or design time, though run time is more flexible).
All controls have a
Tag
property, which you are free to use. It is an
object
reference, so you can put any type of value in it, as long as you cast it back when you want to use it. Since it is part of the Control, there is a different one available for each instance.
Won't that do for your app?
Button b = new Button();
b.Tag = "b";
Controls.Add(b);
TextBox t = new TextBox();
t.Tag = new List<string>() { "Hello", "goodbye" };
Controls.Add(t);
...
foreach (Control c in Controls)
{
TextBox t = c as Textbox;
if (t != null)
{
List<string> list = t.Tag as List<string>;
...
}
}