Writing conversions is usually the only way if the libraries in question do not provide any adaptor interfaces. Any adaptors you make yourself will eventually have to be converted into the library's native representation to perform any algorithms on the geometry.
Another option is to make a wrapper class that caches each different A/B/C representation so that you only have to do the conversion to any given library once for each piece of geometry. And then all your code only deals with the wrapper class and just passes the appropriate representation to any relevant algorithms. The translation can be performed just-in-time before it is actually needed.
If you're working in a language with typedefs and/or nampespaces creating your own typedefs for each library's polygon type can make your life easier. For instance if each library just has its polygon type called 'Polygon' but it is placed into a specific namespace then:
typedef A::Polygon APolygon;
typedef B::Polygon BPolygon;
typedef C::Polygon CPolygon;
If the libraries actually have naming conflicts then that's a real problem.