This should work, and also fixes the nasty sql injection issue:
public bool TableExists(string tableName)
{
    var selectQuery = "SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName";
    using (var conn = new SqlConnection(SqlServerConnectionString))
    using (var cmd = new SqlCommand(selectQuery, conn))
    {
        cmd.Parameters.Add("@TableName", SqlDbType.NVarChar, 128).Value = tableName;
        conn.Open();
        int result = (int?)cmd.ExecuteScalar() ?? 0;
        return result > 0;
    }
}
But you still have this line that is somewhat cryptic:
int result = (int?)cmd.ExecuteScalar() ?? 0;
You could expand it into easier code like this:
public bool TableExists(string tableName)
{
    var selectQuery = "SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName";
    using (var conn = new SqlConnection(SqlServerConnectionString))
    using (var cmd = new SqlCommand(selectQuery, conn))
    {
        cmd.Parameters.Add("@TableName", SqlDbType.NVarChar, 128).Value = tableName;
        conn.Open();
        object result = cmd.ExecuteScalar();
        if (result == null) return false;
        return ((int)result) > 0;
    }
}
Newer versions of C# can shorten this again with Pattern Matching:
public bool TableExists(string tableName)
{
    var selectQuery = "SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName";
    using (var conn = new SqlConnection(SqlServerConnectionString))
    using (var cmd = new SqlCommand(selectQuery, conn))
    {
        cmd.Parameters.Add("@TableName", SqlDbType.NVarChar, 128).Value = tableName;
        conn.Open();
        return (cmd.ExecuteScalar() is int result && result > 0);
    }
}
Or more code, but maybe a little simpler to understand:
public bool TableExists(string tableName)
{
    var selectQuery = "SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName";
    using (var conn = new SqlConnection(SqlServerConnectionString))
    using (var cmd = new SqlCommand(selectQuery, conn))
    {
        cmd.Parameters.Add("@TableName", SqlDbType.NVarChar, 128).Value = tableName;
        conn.Open();
        if (cmd.ExecuteScalar() is int result)
        {
           return result > 0;
        }
    }
    return false;
}
But I'm guessing if you don't like the other code you won't like pattern matching, either.