After experimenting a bit, I came to the final conclusion:
You can do it via next.config.js configuration, which doesn't disable SWC, but there are a few things you should take care of:
- First you need to stop the devserver entirely;
- Then you have to wipe .nextfolder or whatever path is your build;
- Finally, create a folder called scripts, and create a file named whyDidYouRender.jsinside it.
Now edit your config file
// next.config.js:
const path = require('path');
module.exports = {
  /**
   * @param {{[key: string]: unknown}} config
   * @param {{isDev: boolean; isServer: boolean;}} options
   */
  webpack(config, { dev, isServer }) {
    // why did you render
    if (dev && !isServer) {
      const originalEntry = config.entry;
      config.entry = async () => {
        const wdrPath = path.resolve(__dirname, './scripts/whyDidYouRender.js')
        const entries = await originalEntry();
        if (entries['main.js'] && !entries['main.js'].includes(wdrPath)) {
          entries['main.js'].unshift(wdrPath);
        }
        return entries;
      };
    }
    return config;
  },
};
And edit whyDidYouRender file
// scripts/whyDidYouRender.js
import React from 'react';
if (process.env.NODE_ENV === 'development') {
  // eslint-disable-next-line
    const whyDidYouRender = require('@welldone-software/why-did-you-render');
  // @ts-ignore
  whyDidYouRender(React, {
    trackAllPureComponents: true,
  });
}
If you still have trouble, you can replace this line:
if (process.env.NODE_ENV === 'development')
with
if (process.env.NODE_ENV === 'development' && typeof window === 'object')
Or you can remove this check entirely, since this file is only supposed to be imported if webpack's option dev is true and option isServer is false
PS.: Please note that why-did-you-render may run silently if there are no issues, so no console messages doesn't necessarily means it's not running. You can create an issue to test it