Im trying to understand how the ‘name’ attribute works for elements in markup rendered via ASP.NET
I.e. <select id="lblxyz" name="ctl00$c$ctl341$lblxyz">
What are ctl00, c and ctl1341?
If I create a WebControl, give it an arbitrary id, then place a Button inside its Controls collection, the name attribute does not seem to reflect the container’s id?
The key thing as you have discovered is that not all controls trigger this behaviour. The key is the INamingContainer interface. Only Naming Containers will contribute to the name of the control as you have seen, other controls won’t.
The MSDN page linked above says it pretty well: that interface “identifies a container control that creates a new ID namespace within a Page object’s control hierarchy.”