I like the generic shape idea and it doesn't look that bad, you only need an extra routine to create stuff in the list:
void Terrain_Map::Process_Terrain_Shape(Generic_Shape &s, int tile)
{
//create shape from a list of coordinates
for (vector<Coords>::iterator pos=s.points.begin(); pos!=s.points.end(); ++pos)
{
Put_Terrain((*pos), tile);
}
}
void Terrain_Map::Create_Terrain_Ellipse(const Coords &c, int rx, int ry, int tile)
{
Generic_Ellipse e(c, rx, ry);
Process_Terrain_Shape(e, tile);
}