You can't "change the type" of a control - if you declare a TextBox, then it is a TextBox - you can cast it to anything lower down in the chain of things it is derived from but you can't cast sideways. In this case, both Label and TextBox are derived from Control, so you can happily say:
TextBox t = new TextBox();
Label l = new Label();
Control c = (Control) t;
c = (Control) l;
As it happens you don't even need to caste this as it will work perfectly well.
But you can't subsequently say
c = t;
l = (Label) c;
Because it will complain that there is no conversion from a TextBox to a Label.
If what you are trying to do is have an indexer that returns two different types depending on the context it is used in, then you can't - there is (understandably) no mechanism in C# to do that - just like there is no mechanism in C# for two methods differing only in return type.
You could make it generic (MSDN indexers
] includes a generic example) but you can't do what you want exactly.