You can use any non-empty sequence of characters other than a newline as the delimiter. POSIX doesn't state any limitation. You can specify a newline in the delimiter, but then it will never be found. Many shells support empty delimiters, but ATT ksh doesn't. In fact most shells accept arbitrary sequences of bytes other than null and newline, but I wouldn't recommend using invalid byte sequences. I also recommend not using carriage return characters as those may get reencoded away when the script is edited or transferred to another machine. Trailing whitespace is also prone to being accidentally removed during edition. Sticking to printable ASCII is safer.
Of course, if the delimuter includes a character that has a special meaning in shell syntax, you'll need to quote it after the
<< operator, and then you can only use a literal here-document, not a here-document with variable and command substitution.