Oh right, I can use compilation-buffer-name-function. My only issue is that it doesn't have enough context to generate a meaningful buffer name; it only takes a name-of-mode. A meaningful buffer name could consist of the regexp or the entire grep shell command.

On Thu, Jan 25, 2024 at 2:24 AM Eli Zaretskii <eliz@gnu.org> wrote:
> From: Nafiz Islam <nafiz.islam1001@gmail.com>
> Date: Wed, 24 Jan 2024 15:16:12 -0500
>
> The way `grep' and `vc-git-grep' works right now is that it will always output its result to a buffer called
> `*grep*'. So, if I perform another `grep' command, it will overwrite the previous grep result (unless I
> rename the buffer beforehand).
>
> I would like, at least, an option to create a new buffer each time a `grep' command is executed.
> Maybe each new buffer could be given the name based on the regexp or the grep shell command
> used.

Did you try to define a compilation-buffer-name-function that would do
what you want?  Such a function can produce any buffer name you want.