I just managed that - kind of - I used a height Map - But the question for you that will dictate HOW is "What will it be made of?"
1: A "DarkMatrix" - Easiest to me - Limited in size - not the fastest way to go from a "Execution" perspective. Allows Texturing Tiles I Think - I don't think you have to have a "Stretched SuperTexture - but I'd double check.
2: "Terrain" Object (Think advanced Terrain) - A bit cumbersome until you get used to it - Needs a "SuperTexture" that it au-jo-magically Stretches over the entire terrain - then it overlays this "color blur" with a "see through" "Detail" tile so it looks more like ground with rocks - bumps etc. Execution Speed? Fast - it does some Background work for you to make it "play Nice - and Fast" - Sometimes - (more in DarkGDK than DBPro - probably my fault to - I have seen anomallies with BIG BIG ones.)
3: Homemade Mesh? (Where you create each Poly - Lay them out - then adjust "heights" or whatever?) - Hardest - Most Rewarding - You need to plan for your own "Speed-Up" system (See Frustrum Limb Culling) - Careful - I read DBPro/DarkGDK do better with a few limbed objects than a ton of "Object Tiles" - as the less "Object Id's" the better. The other enemy is poly count. More = Nicer Looking = Slower FPS - So you need to manage. Also, You need to think a bit differently about it all. Setting Verts (Heights) requires adjusting multiple "Poly" Verts that share the same "Vert" space. That can get tricky. I can give you some source - It works - but its a "Test" app I'm using to make my terrain. I uploaded Some Source Here:
http://forum.thegamecreators.com/?m=forum_view&t=120102&b=22&p=0
[edit]I also Recommend you start your Arrays at ZERO. It makes locating "Tiles" Easier.
See my loops in the Thread I posted - you'll probably see what I mean. In Short - imagine two loops - for a grid. X,Y Coords - Look at how I would plot them:
Across=10
Down=10
Loop X= 0 THRU Across (for a 10x10 grid)
Loop Y= 0 THRU DOWN
...looping
CurrentTILE = X+(Y*ACROSS);
...Looping
Beter than this kind of non-sense:
CurrentTILE = (X-1)+((Y-1)*ACROSS)+1;
[/edit[