Assuming you really want to create distinct variables $Button1, $Button2, ... rather than storing your button objects in a single array variable:
New-Variable "Button$_" -EA 0
(Get-Variable "Button$_").Value = New-Object System.Windows.Forms.Button
works, but can more simply and more efficiently be written as:
Set-Variable "Button$_" (New-Object System.Windows.Forms.Button)
Note: The "..." around Button$_ isn't strictly necessary here, but it makes the intent clearer.
or, in PSv5+:
Set-Variable "Button$_" ([System.Windows.Forms.Button]::new())
If you want to obtain a reference to the newly created variable object at the same time, using
-PassThru:
$buttonVar = Set-Variable -PassThru "Button$_" ([System.Windows.Forms.Button]::new())
$buttonVar.Value.FlatStyle = 'Flat'
Alternatively, you can store the button object directly in an aux. variable with a fixed name:
Set-Variable "Button$_" ($button = [System.Windows.Forms.Button]::new())
$button.FlatStyle = 'Flat'
Note how the variable assignment ($button = ...) is part of the constructor expression.