I assume you mean "valid" means it follows the general format of an email address and not that it is actually a valid email address (which is harder to prove). MailAddress already handles validation for basic email addresses. So you just need to create an instance of it, which you're already doing. However it throws an exception if it fails so use TryCreate if you are targeting .NET 5 or greater. If you're using NET Framework then you'll need to write your own version.
bool TryCreateEmail ( string input, out MailAddress result )
{
try
{
result = new MailAddress(input);
return true;
} catch (FormatException)
{
} catch (ArgumentException)
{ };
result = null;
return false;
}
After that it becomes a simple matter of enumerating the addresses and trying to create a mail address for each one. If any fail then you can display your message. If you want the actual emails then it becomes a little more code. If you don't care then the code is simpler.
var emailAddresses = TextBox3.Text.Split(',').Select(x => new { EmailText = x, EmailAddress = (TryCreateEmail(x, out var result) ? result : null }).ToArray();
//Get invalid email addresses
var badAddresses = emailAddresses.Where(x => x.EmailAddress = null);
if (badAddresses.Any())
//Some bad ones
The above code basically breaks up the address text, sends each one through a transform that returns the original text plus the email address, if any. Then you can get the bad email addresses, if any to report as errors.