Respostas:
grep -r foo *não procura correspondências em arquivos ou diretórios ocultos, também *é expandido pelo shell, para que você possa acabar com um erro muito longo da lista Argument quando houver muitas entradas no diretório atual ou outros erros ou mau comportamento, se o O nome de alguns dos arquivos ou diretórios começa com um caractere de hífen.
A invocação grep -r foo .não possui as falhas acima
Atualizada:
Outra diferença: a página de manual do grep (@ fedora17) diz:
-r, --recursive
Read all files under each directory, recursively, following symbolic links only if they
are on the command line. ...
Também haverá uma diferença quando você executar este comando em um diretório vazio:
$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$
Se você usar asterisco, não poderá corresponder arquivos em diretórios cujo nome comece com um ponto, como .cache.
Atualizar:
Isso ocorre porque o *shell é expandido antes da chamada grep, para que ele receba uma lista de nomes em vez de um único nome de diretório (para o atual .). O shell maneira expandir o padrão pode ser personalizado com o parâmetro shell (como para nullglob, nocaseglobou outras bashopções) ou ser variáveis de ambiente (como LANGou LC_ALL)