Regexes in PowerShell are defined with string literals, not regex literals (structures like action/pattern/flags).
The g flag is not implemented as a regex option in PowerShell, you need to use mutliple matching. If you use Select-String, you will need -AllMatches option to match all occurrences. If you use the .NET regex API, ypu can use the Regex.Matches method that finds all occurrences.
The i and s flag usage is simpler, you may just use them as inline modifier, (?s), (?i), or joined as (?si) that you can place at the start of the pattern so that they could affect the whole pattern (or place them anywhere in the pattern so that to affect all the pattern to the right of them (and you can disable them with (?-s)/(?-i)/(?-si))).
If you define a regex object, you can use [Text.RegularExpressions.RegexOptions]'Singleline', [Text.RegularExpressions.RegexOptions]'IgnoreCase', or [Text.RegularExpressions.RegexOptions]'IgnoreCase, Singleline'.
When you need to use s flag, you must make sure your input is treated as a single multiline string. If you read files in, you need to make sure you use -Raw option with Get-Content.
Here is an example of the gis flag "conversion" in PowerShell:
$rx = [System.Text.RegularExpressions.Regex]::new('(?<=#start)(.*?)(?=#end)', [Text.RegularExpressions.RegexOptions]'IgnoreCase, Singleline')
$test=@'
#start
hello powershell regex
what is the equivalent of flags gis
#end
'@
$rx.Matches($test).value
Output:
hello powershell regex
what is the equivalent of flags gis
The same result can be obtained with
($test | Select-String -Pattern '(?si)(?<=#start)(.*?)(?=#end)' -AllMatches).Matches.Value