Eventually i went in other direction, since i don't (want to) control the passed listmodel-
Instead of a index -> Image mapping i used a (list) Object -> Image mapping. I'm using this for the indexes to be always consistent even with mutable listmodels. I also don't control the Image getting policy. In particular it can even be in another thread (and is in my implementation).
I don't trust weak references, since the memory is only going to be reclaimed when the GC feels pressured. In particular i'm allocating huge arrays somewhere else. The approach i used uses the JList natural lazy painting to only have in memory the visible cells at the time, and the other are disposed/need to be refetched.
This is very much more complicated, but i think it is flexible... somewhat, for this purpose only. If you're curious how it works/looks see my newly created blog here:
http://swingblognotthatkind.blogspot.com/