"It will keep on reading until it encounters the end-of-file character." – No. It will keep on reading until a read returns zero bytes.
^D in ASCII is EOT (end of transmission), but when you type Ctrl+D while providing input for grep, the character does not get to grep (unless preceded by ^V). The character is interpreted by the terminal driver. See this question. Run stty eof ''; grep . and you wont be able to exit grep with Ctrl+D because the character will actually get to grep and it will be treated like any other byte.