```python
def quarter_spin(grid: list, turns: int) -> list:
    if not grid or not all(len(row) == len(grid[0]) for row in grid):
        raise ValueError("Input must be a non-empty square grid")
    
    turns %= 4
    
    if turns == 0:
        return [row[:] for row in grid]
    elif turns == 1:
        n = len(grid)
        result = [[0] * n for _ in range(n)]
        for i in range(n):
            for j in range(n):
                result[j][n - 1 - i] = grid[i][j]
        return result
    elif turns == 2:
        return [row[::-1] for row in grid[::-1]]
    else:  # turns == 3
        n = len(grid)
        result = [[0] * n for _ in range(n)]
        for i in range(n):
            for j in range(n):
                result[n - 1 - j][i] = grid[i][j]
        return result
```