I used an 8-bit seed dictionary and 11-bits to control the amplification functions, so the virtual CB size was 512K entries. The seed dictionary and functions were tuned on the set of photos, test images, and textures used to tune crunch. My current implementation seems to work best on photos and textures, and worst on synthetic images and high-contrast text.
In .basis, this method is currently only used to compressed selector codebooks, not entire images, so a brute force search over the entire virtual codebook isn't too insane. Also, basis supports a hybrid codebook mode, so it can select between virtual VB entries and "raw" entries depending on quality.
(Posting links so blogger doesn't resample the images.)
ETC1 compressed with selectors chosen from a 512K virtual codebook - .977149 Luma SSIM
ETC1 compressed - .996428 Luma SSIM
Other ETC1 examples using vitual selector CB's (sorry no SSIM's, although I do have this data):