The shell may transform the command line before the command execution. Both the shell and grep may use quoting to remove the special meaning of some characters. Nonetheless, grep and shells have different special characters. Moreover, unescaped special characters that did not result from an existing expansion are removed, before the command execution, by the shell.
echo '[]' | grep '[]'
The shell transmits the argument [] to grep and it is parsed as a malformed bracket expression by grep.
echo '[]' | grep \[]
Above, we can see a similar case. The backslash is removed and [] is transmitted as argument to grep. grep recognizes a malformed bracket expression.
echo '[]' | grep '\[]'
Finally, in this case, the quotes are removed by the shell and \[] is transmitted as argument to grep but, in this specific case ¹, \[ is interpreted by grep as a literal bracket. Quotes are needed to prevent the interpretation of the backslash as a special character by the shell.
¹ POSIX specification.