grep -r foo * doesn't look for matches in hidden files or directories,
* 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.
grep -r foo . doesn't have the above flaws
Another difference: grep's man page (@fedora17) says:
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
$ grep -r foo .; echo $?