The word "viipera" (long "i") was contracted from "vivipara" (Latin "v" was pronounced like English "w", which favorised the contraction of sequences like "wiwi" into "wii", in a few words), with also the regular change of the unaccented "a" into "e", which happened in all the older Latin words. "Vivipara" is the feminine form of the Latin word that is the source of English "viviparous".
The vipers are unusual between snakes by giving birth to live young, instead of laying eggs, like most snakes.
Both "noun stem with final vowel changed to i" and "noun stem followed by epenthetic i" have happened.
The former to the stems ending in "a" or "o", the latter to the stems ending in a consonant. An alternative interpretation would be that for the stems ending in a vowel the final vowel was removed and an epenthetic "i" has been added, but this is a more artificial interpretation, because there was never an intermediate stage having an "o" stem or "a" stem without the final vowel.
There also exists one case of an older compound word where the initial noun was a stem ending in "i", but the final "i" has been dropped, and the verb remained as a bare root, without forming a stem by the addition of a vowel: "avspec-", which means bird-watcher (with the nominative written as "avspex", i.e. "auspex" in the modern spelling, the source of English "auspices"), from "avi-" = bird and "specere", the non-frequentative form of "spectare". Another example of an old compound word with no epenthetic "i" and with only the bare root of the verb is "juudic-" = judge (justice-sayer, from "juus" and "dicere"). With the exception of a few inherited old compound words like these, all the compound noun+verb words coined more recently used an "i" ending for the noun and a verb stem terminated in the vowel corresponding to the gender.
While you were partially right that the compounds with "ferre" and "gerere" are the most numerous, for the obvious reason that one can form such a compound word for any object that can be carried, there are a large number of Latin words made from nouns with other verbs.