I think there are two issues being confused here:
1. From the original post (and personal experience) there is an IIS/aspnet_isapi.dll issue here. IIS is interpreting a socket disconnect as end of stream, and therefore violating the HTTP protocol. HTTP has a header which determines the number of bytes in the body. If the socket is disconnected before receiving this number of bytes, IIS should determine that it is a bad request, and never forward it on to ASP.NET. When the error is:
Invalid length for a Base-64 char array
The client disconnected. ---> System.Web.UI.ViewStateException: Invalid viewstate.
Invalid length for a Base-64 char array
It doesn't sound like that is the case.
2. A good craftsman can definitely blame his tools if they don't perform to spec. (at least until he discovers the problem finds a work around!). The .NET framework is presented as a black-box, a layer on top of which we are to build applications. It is not the job of application code to ensure its foundations work properly. ASP.NET knows the user_agent, and should limit the viewstate to a size compatible with that browser. If the viewstate exceeds what a browser can handle, it should either break it up into multiple form elements, or throw an exception server-side on rendering.
AFAIK there is no way to check the size of the viewstate after encryption and BASE 64 encoding (aside from writing an HTTP Module), so there is no clean way for an ASP.NET app to even know whether its viewstate will cause an error.
Until such issues are resolved it seems like best practice is to implement server-side paging in datagrids, watch the number of controls on a page, and generally use common sense to prevent overflows. I must say with IE 6 & 7 at least, I have built some pretty large viewstates and never seen this problem occur, although I wouldn't doubt it could happen on older browsers.