In caveman v3.0, different types of grass are implemented different ways.
for sparse scrub grass, grass is placed via a "plant map". a plant map is a map of a 800x800 foot area of the world, implemented as a sparse matrix, containing 1300 plants. so there are 1300 clumps of scrub grass in an 800x800 foot area. location is random, as is size, rotation, mesh, and texture. height is determined by calling the heightmap function with the location of the plant.
for dense grass such as prairie or tall grass, grass is placed every 4 feet or so, with random jitter to the location, and random scale, rotation, mesh, and texture.
plant maps are generated once at new game start. they are tiled across the world to define the location of every plant in the game. the game world size is 2500x2500 miles.
plant map size is selected large enough so that no moirre' patterns from tiling are noticeable, IE a little bigger than max visual range.
plant maps are save and loaded with the savegame, so plants don't suddenly move.
i can draw about 15,000 plants with dx9 fixed function, no instancing, no LOD, no imposters, on a low end PC. i'm currently drawing grass at full resolution out to about 1000 feet (~300 meters). and that can just as easily be swaying grass. just haven't added the code yet to change the rotation over time.
one trick to drawing lots of grass is low poly models. a few simple quads with their tops twisted in relation to their bottoms works amazingly well.
good models and textures are the key to good looking results.