I've been working on making my project able to use multiple APIs albiet for now just Direct X 9 and 11. My first attempt was to emulate DirectX 11 and make Direct X 9 fit to it. Later because I wanted it to be easier for others to use my coded, I decided on a more high level solution. I've found that both have their plusses and minuses.
At first, it all depends on whether you are fine with compile-time dependency for one of the APIs or actually want to be able to switch between them on run time. For latter, you are going to need a very complicated system of designing an API-agonstic layer atop all your other abstractions, but thats another topic. I just wanted to add that you don't really have to chooce between any of those two - I'd say you fare well if you sort of combine them too. I (before going API agnostic) used a two layer abstraction approach - one lower, and one higher level. That said, I have to disagree with some of your points:
Low Level (pick your favorite api and emulate it )
Good
* It's easier to build higher level functionality because everything has the same base
Bad
* As AgentC said, you can run into some non-optimal situations that could take some "hacks" to fix.
Why is it easier to build higher level functionality that way? It's probably that, if you don't follow the Dependency Inversion principle, it might be harder to build your functionality the other way round, but to say generalizing that the low-level approach is easier to build upon is just... wrong, at least IMHO.
High Level
Good
* You can code things in the most optimal way for the API.
Bad
* Without adequate planning it could almost be like coding two engines. You must be sure you isolate similarities or you'll end up coding many things twice.
Just one word: Interfaces! Whether a direct approach (java, ...) or the languege abstracted equivalent (C++, ...), if you design your API abstraction layer with those, and follow most importantly all patterns of the SOLID principles, it isn't really any "harder" than using a low level approach only. But you are right in a way, for an inexperienced programmer, it might be hard, given that those will possible meet the requirement of "no adequate planning" more easily. But going "low-level" isn't going to be easier for him in any way, and then again, a programming beginner shouldn't be aiming for making a multi-API "engine" anyway. At least in my opinion.
Once again talking about my way, I actually have a low-level encapsulation around the actual API I'm using (not interchangable, each abstraction is completely independant of any other API's abstraction) combined with a high level abstraction, that supplies interfaces like ITexture, IMesh, ISprite etc... . From those you would inherit your actual API dependand implementations, like DX9Texture, DX9Sprite, etc... . Now truly like you said, if one e.g. wasn't using interfaces properly, he might end up having to rewrite huge parts of his engine just to fit for the specifiy API. But that way, I'm taking advantage of both the low-levelish encapsulation and the high-level abstraction.