Dominic,
First let me ask if I am understanding you right. You need to tie external data to the Kentico ContactInfo class, correct? I am assuming this means when a user clicks on a contact they would get an additional information displayed from the external data source? And you want them to be able to click those external data items and pull that detailed information up as well? Or just be transferred to the other system?
Here is a couple of recommendations for you.
First you are probably on a bit of the right track, but I would probably recommend you don't use custom macros. Depending on the number of users you have accessing this system, Macros tend to have quite the resource cost for them in Kentico vs. your own custom code. Using custom code, you could either build your own controls (take a look at the UniGridView control as one that gets used in most of the admin screens) and bind the data to it using how ever your foreign key relationship is and then bind to a detail screen (or transfer to the other system). Using this method will also give you more flexibility in growing into additional requirements as well.
Second, where modifying a class in the Web UI can be easy to do, I would also stray away from doing this alot. We do it on occasion, but you always run into issues with upgradeability. You could, as an alternative, extend the class via the API code (using ovverride) to complete your additional coded needs.
Where I have not done this stuff with the Contact information, I have with extending the ecommerce orders class and if you take a good look at the pattern Kentico has built in their webparts and API code, you can really get a long ways in mimicking it and adding your own functionality.
Thanks.