grep -r foo * doesn't look for matches in hidden files or directories,
also * is expanded by the shell so you might end up with an Argument list too long error when there are a lot of entries in the current directory, or some other errors or misbehaviour if the name of some of the files or directories starts with a dash character.
Invocation grep -r foo . doesn't have the above flaws
Updated:
Another difference: grep's man page (@fedora17) says:
-r, --recursive
Read all files under each directory, recursively, following symbolic links only if they
are on the command line. ...
There will be also a difference when you execute this command in an empty directory:
$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$