It's simply design decisions at Gamefreak. You can make some rough inferences such as things that attack with teeth may learn the Bite moves and things with fists or that evolve to have fists (Wooper) may get the punches but the only real way to know what moves a pokemon can learn is to look at its move list for your generation which is most easily/readily found on Bulbapedia or Serebii.
There's a wide variety of reasons a pokemon might have or not have a move; logically fire type pokemon will have fire type moves but few or no water type moves, but what moves any given pokemon have depend a lot on balance (the likely reason only Pikachu has volt tackle) and "flavor"; for example Weavile learns lots of slashing moves because of its large claws but (annoyingly) does not learn Crunch or Bite as it's not known for attacking with its teeth.
The actual move list a pokemon learns by level/egg is picked manually by Gamefreak (and changed generation to generation) and is mostly the intersection between balancing pokemon out and giving them fairly logical moves. Even if Wooper can learn Ice Punch.