Самым близким к читаемому пользователем сообщению, которое предоставляет PostgreSQL, является текст сообщения, отображаемый в PostgresException.
Однако, как правило, не рекомендуется представлять ошибки базы данных непосредственно пользователям. (включая пользователей веб-API): они предназначены для приложения, непосредственно взаимодействующего с базой данных (т.е. вашего приложения). Эти сообщения, как правило, мало что значат для пользователей вашего API, и что более важно, они пропускают потенциально конфиденциальную информацию о вашей схеме базы данных и, следовательно, не являются безопасными. Это особенно проблематично c, чтобы выгрузить / сериализовать все исключение для пользователя, как вы, кажется, делаете (с JsonConvert.SerializeObject).
Лучшей практикой здесь будет определение допустимых исключений базы данных, которые пользователь может вызвать, перехватить их и вернуть собственное сообщение с соответствующим названием (например, «Пользователь с таким именем уже существует»).
В качестве примечания, чтобы идентифицировать PostgresException, а не получать имя исключения и по сравнению с этим вы можете просто использовать C# сопоставление с образцом:
if (context.Exception.InnerException is PostgresException postgresException)
{
// ...
}