Use sticky sessions as mentioned in this similar post. This will keep users on the same machine for a period of time.
I don't think it wise to allow a single user to hit three different versions of the framework in a single session.
You're right that it's OK for it to be in an UpdatePanel - this shouldn't make any difference.
I suspect that the ViewState is disabled either for your control or for one of its parents: if it's disabled for any parent (all the way up to the page), it'll be disabled for your control.
To get round this, you can use the page's ViewState dictionary instead of the one on your control.
I.e. instead of saying:
this.ViewState[ "Expandedness" ] = ListState.Expanded;
say:
this.Page.ViewState[ "Expandedness" ] = ListState.Expanded;
If it's possible that there's more than one instance of your control on the page, you'll need to ensure the ViewState key is unique, perhaps like this:
this.Page.ViewState[ this.ClientID + "Expandedness" ] = ListState.Expanded;
As an alternative (that will work even if ViewState's disabled for the page), you could consider storing the Expandedness in the ControlState. It's a bit trickier, but google it and you'll find a code sample pretty quickly. It's recommended you store only an absolute minimum of information in the ControlState, but a single flag like this is fine (and actually what it's designed for, really).
Best Answer
Well it depends. Invalid viewstate can happen for a variety of reasons.
Whatever you do do not turn off viewstate or event validation.