Could these two words:
- stem from the same PIE root, and survived relatively unskathed
- have been borrowed one from the other, making one or both of the etymologies dubious
- have been borrowed from a non-IE language (perhaps in Shetland or other point of contact) into both Early Celtic and Old Norse
Yes indeed! All three are plausible on the surface (as in, all three of these things happened for various words in various languages); in this specific instance, I think it's a mixture of the second plus a healthy dose of coincidence.
The PIE root for "cow" is reconstructed as *gʷṓws; in various languages, including P-Celtic, P-Italic, and some varieties of Greek,
/b/. This is why we see Latin bōs (*), Old Irish bó, Ancient Greek boûs, and so on. This is the first part of the proposed Celtic origin.
But this shift (the "Q-to-P shift") did not happen in Germanic, which is why we see the English word "cow" from the same root, with a
/k/. Instead, Germanic had a presumably unrelated root *būą "building", which gives Old Norse bú and all its descendants. This is the first part of the proposed Germanic origin.
Meanwhile, Germanic also had a root *gardô (and/or *gardaz), "fence, enclosure, yard". This is the origin of English "yard" and "garden", via two different paths, and became enormously popular in Romance, completely displacing native Latin words like hortus. So it was clearly a popular word in Germanic, and it's not much of a stretch to imagine it being borrowed into Celtic languages too. This seems to be the last part of both reconstructions.
As for which one is correct—I'm afraid I don't know enough to say. It's not inconceivable that both the Celtic root for "cow" and the Germanic root for "building" influenced the name of the location, but it would require someone more familiar with the history of Britain to say for sure.
(*) Latin is not in fact a P-Italic language, but it has lots of loans from Oscan and Umbrian, which were. The word for "cow" seems to be one of them.