Re 1 and 2. When you implement a cache listener, you get callbacks for cache entry modified, you get the key, so in theory you could modify bits of the key, but when you implement a cache entry visited, any modifications to the key won't have effect on the key used for looking up. So, the answer is no.
Re 3. You can do that wiht a cache listener, by modifying the value part when isPre=false.
Btw, if you wanna do all this for 2LC, you need to get hold of the cache manager and get the caches for each entity/collection (normally we use the FQN of the cache, or region name configured)