My initial attempt was similar to your solution: I instantiated a separate StringGrid to use as a filter. The somewhat (well, slightly) tricky part is that I want interactive filtering, which hides or shows rows in the grid as the user modifies the filter. My data requirement is modest (less than a thousand rows), and thus it is possible. However, it implies that I need to keep track of the internal editor the grid uses and hook into that editor's OnKeyPress and OnKeydown events. It's feasible, but the code is more obscure.
I'm going to think some more ...