That's the perfect question. I worked on a different type of granular synthesis over the holidays, which I called "triggerGrains" (recently merged into the master branch). While working on it, I had the same question, and decided in the end to leave grainLength as a control-rate input, while numGrains could be either.

That said, I can imagine that the texture of the granulation might be much more configurable if grainLength were also audio rate modulatable. It's totally up to you. What do other granular synthesis engines do?