Wildcards aren't needed to allow a Cat or a Dog to be added to a list of Animals. There's something called the Liskov Substitution Principle - anywhere an instance of a class us needed, then an instance of any subclass can be used. Google it and you'll get a lot more explanation.
Wildcards are different, and are a way of getting round the problem Martin mentioned above. The generic tutorial will explain more, but make sure you understand how generics work without wildcards first.
I’ve looked at a lot of different solutions, and in my humble opinion Aspose is the way to go. Here’s the link: http://aspose.com