I want to create an object of arbitrary values, sort of like how I can do this in C#

var anon = new { Name = "Ted", Age = 10 };

You can do any of the following, in order of easiest usage:

  1. Use Vanilla Hashtable with PowerShell 5+

    In PS5, a vanilla hash table will work for most use cases

    $o = @{ Name = "Ted"; Age = 10 }
    
    <br/>
  2. Convert Hashtable to PSCustomObject

    If you don't have a strong preference, just use this where vanilla hash tables won't work:

    $o = [pscustomobject]@{
        Name = "Ted";
        Age = 10
    }
    
    <br/>
  3. Using Select-Object cmdlet

    $o = Select-Object @{n='Name';e={'Ted'}},
                       @{n='Age';e={10}} `
                       -InputObject ''
    
    <br/>
  4. Using New-Object and Add-Member

    $o = New-Object -TypeName psobject
    $o | Add-Member -MemberType NoteProperty -Name Name -Value 'Ted'
    $o | Add-Member -MemberType NoteProperty -Name Age -Value 10
    
    <br/>
  5. Using New-Object and hashtables

    $properties = @{
        Name = "Ted";
        Age = 10
    }
    $o = New-Object psobject -Property $properties;
    

Note: Objects vs. HashTables

Hashtables are just dictionaries containing keys and values, meaning you might not get the expected results from other PS functions that look for objects and properties:

$o = @{ Name="Ted"; Age= 10; }
$o | Select -Property *

Further Reading