Mwa-ha-ha-ha... lo he solucionado!! Era algo tan simple como envolver la expresión regular con comillas, de esa manera no incluye en el resultado nada que vaya pegado a la cadena que coincida con el criterio. Es decir, el primero de los tres pasos queda así:
cat archivodeorigen | grep -o "[A-Za-z0-9_\-\.]*@[A-Za-z0-9]*\.[A-Za-z0-9]*" > listadirecciones
Así que la lista queda reducida de más de 2300 a 2146. He eliminado alrededor de 200 resultados erróneos.
Por cierto, ya que estamos... ¿sabéis qué otros caracteres pueden formar parte de una dirección de correo electrónico aparte de los listados? Es decir, aparte de letras de la A a la Z, números del 0 al 9, puntos (.), guiones (-), y guiones bajos (_).