One drawback of #2 that I forgot to mention, which is also a weakness in #1 and in the current code, is that they do not play well with class and community portal pages.
This is because the shaded/unshaded settings are tied to the portlet's element_id, which is not user-specific on class and community portal pages.
Tracking user specific settings on shared portlets could be done on the client side with cookies (#3) or on the server side but this would require data model changes.