I never saw that internal error, most internal errors I know are just written to stdout, the application did never quit (on my machine), they sometimes appear when using trimeshes. Maybe you could debug the code and give some further information, e.g. a callstack would be nice.
If you use the normal ITerrainSceneNode class it works. Half of the demos included use terrain (IrrOdePlayground and IrrOdeCar), just add a terrain in IrrEdit as child of the worldnode and then add a CIrrOdeGeomHeightfield node as child of the terrain. Should work fine that way. You could also take a look at the IrrEdit file that is used in the IrrOdeCar demo (except for the bullets the tank shoots all scene nodes are created in IrrEdit).
You don't need to load a scene before calling the ode init method (if you are speaking of CIrrOdeManager::getSharedInstance()->initODE()). CIrrOdeManager::getSharedInstance()->initPhysics() must be called after some objects are present to be initialized, this actually adds your scene to the physics while initODE just does some initialization of ODE (I think it's just one method call).
