It appears that the com.sun.faces.context.StateContext in 2.0.3 has an AddRemoveListener class that caches the FacesContext in a member variable. In the Portlet environment the Faces Lifecycle is run across two portlet request each which establish and remove a FacesContext. Unfortunately this listener seems to be held/cached/reused across these two requests causing an exception to be thrown when it dereferences the FacesContext (in its member variable) which was released at the end of action processing.
Simple fix is to not store the FacesContext is a member variable but to always get/access it via FacesContext.getCurrentInstance(). Alternatively steps could be taken to release this listener when the FacesContext is released.