Are you sure that's a good strategy if every unique index value requires you to buy a physical container?

How about arithmetic coding? That will give you the highest amount of entropy reduction for any possible number of containers. Which probably means that you’ll sort similar pieces far apart but group by colors that are easy to separate, like red+yellow, brown+green

You can put a few shapes into one container and it's still much faster than searching color-first.

Radix sort. Decide how many containers you're fine with, and group accordingly.